package com.ingenieria.industrial.controller;

import com.ingenieria.industrial.dto.JCMail;
import com.ingenieria.industrial.dto.Usuario;
import com.ingenieria.industrial.service.implementacion.UsuarioService;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class UsuarioController extends BaseController {

    @RequestMapping(params = "action=inicio")
    public ModelAndView inicio(HttpServletRequest request) {
        HttpSession sesion = request.getSession();
        if (sesion.getAttribute("cod_usu") != null) {
            ModelAndView mav = new ModelAndView("index");
            mav.addObject("cod_usu", sesion.getAttribute("cod_usu"));
            mav.addObject("cod_rol", sesion.getAttribute("cod_rol"));
            mav.addObject("usuario_nombre", sesion.getAttribute("nombre"));
            return mav;
        } else {
            ModelAndView mav = new ModelAndView("index");
            return mav;
        }
    }

    @RequestMapping(params = "action=lista")
    public ModelAndView getAll(HttpServletRequest request) {
        HttpSession sesion = request.getSession();
        if (sesion.getAttribute("cod_usu") != null) {
            ModelAndView mav = new ModelAndView("main.usuarios.lista");
            UsuarioService service = new UsuarioService();
            try {
                ArrayList<Usuario> lista = service.getAll();
                mav.addObject("cod_usu", sesion.getAttribute("cod_usu"));
                mav.addObject("cod_rol", sesion.getAttribute("cod_rol"));
                mav.addObject("usuario_nombre", sesion.getAttribute("nombre"));
                mav.addObject("lista", lista);
            } catch (Exception e) {
            }
            return mav;
        } else {
            ModelAndView mav = new ModelAndView("index");
            return mav;
        }
    }

    @RequestMapping(params = "action=nuevo")
    public ModelAndView mostrarForm() {
        Usuario registro = new Usuario();
        ModelAndView mav = new ModelAndView("main.usuario.nuevo");
        mav.addObject("registro", registro);
        return mav;
    }

    @RequestMapping(params = "action=recov_pass")
    public ModelAndView recoverPass() {
        JCMail registro = new JCMail();
        ModelAndView mav = new ModelAndView("main.recuperar.contraseña");
        mav.addObject("registro", registro);
        return mav;
    }

    @RequestMapping(params = "action=guardar")
    public ModelAndView guardarUsuario(@ModelAttribute Usuario registro, HttpServletRequest request) throws Exception {
        Usuario usuario = null;
        UsuarioService service = new UsuarioService();
        try {
            usuario = service.getById(registro.getCod_usu());
            if (usuario != null) {
                ModelAndView mav = new ModelAndView("mensaje");
                mav.addObject("msg", "Ya existe registrado el número DNI");
                return mav;
            } else {
                registro.setClave(registro.getClaveEncrypt(registro.getClave()));
                if (service.insert(registro)) {
                    StandardPBEStringEncryptor s = new StandardPBEStringEncryptor();
                    s.setPassword(obtenerClaveEncript());
                    registro.setClave(s.decrypt(registro.getClave()));
                    usuario = service.login(registro.getCod_usu(), registro.getClave());
                    ModelAndView mav = new ModelAndView("main.usuario.nuevo.adic");
                    if (usuario != null) {
                        HttpSession sesion = request.getSession(true);
                        sesion.setAttribute("session_id", sesion.getId());
                        sesion.setAttribute("cod_usu", usuario.getCod_usu());
                        sesion.setAttribute("nombre", usuario.getNombre());
                        sesion.setAttribute("descrip_rol", usuario.getDescrip());
                        sesion.setAttribute("cod_rol", usuario.getCod_rol());
                        mav.addObject("cod_usu", usuario.getCod_usu());
                        mav.addObject("cod_rol", usuario.getCod_rol());
                        mav.addObject("descrip_rol", usuario.getDescrip());
                        mav.addObject("usuario_nombre", usuario.getNombre());
                        mav.addObject("sesion_id", sesion.getId());
                        mav.addObject("msg", "Se registró correctamente el usuario");
                        mav.addObject("registro", registro);
                    }
                    return mav;
                } else {
                    ModelAndView mav = new ModelAndView("mensaje");
                    mav.addObject("msg", "No se pudo registrar el usuario");
                    return mav;
                }
            }
        } catch (Exception e) {
        }
        return null;
    }

    @RequestMapping(params = "action=detalle")
    public ModelAndView mostrarDetalle(HttpServletRequest request) throws Exception {
        HttpSession sesion = request.getSession();
        UsuarioService service = new UsuarioService();
        Usuario registro = null;
        if (sesion.getAttribute("cod_usu") != null) {
            ModelAndView mav = new ModelAndView("main.usuario.detalle");
            String cod_usu = (String) sesion.getAttribute("cod_usu");
            try {
                registro = service.getById(cod_usu);
                mav.addObject("cod_usu", sesion.getAttribute("cod_usu"));
                mav.addObject("cod_rol", sesion.getAttribute("cod_rol"));
                mav.addObject("usuario_nombre", sesion.getAttribute("nombre"));
                mav.addObject("registro", registro);
            } catch (Exception e) {
            }
            return mav;
        } else {
            ModelAndView mav = new ModelAndView("index");
            return mav;
        }
    }

    @RequestMapping(params = "action=inf_adicional")
    public ModelAndView nuevoInfAdic(HttpServletRequest request) {
        HttpSession sesion = request.getSession();
        Usuario registro = new Usuario();
        Usuario usuarioInfp = new Usuario();
        UsuarioService service = new UsuarioService();
        if (sesion.getAttribute("cod_usu") != null) {
            String cod_usu = (String) sesion.getAttribute("cod_usu");
            try {
                usuarioInfp = service.getInfPer(cod_usu);
            } catch (Exception e) {
            }
            if (usuarioInfp == null) {
                ModelAndView mav = new ModelAndView("main.usuario.nuevo.adic");
                mav.addObject("cod_usu", sesion.getAttribute("cod_usu"));
                mav.addObject("cod_rol", sesion.getAttribute("cod_rol"));
                mav.addObject("usuario_nombre", sesion.getAttribute("nombre"));
                mav.addObject("registro", registro);
                return mav;
            } else {
                try {
                    registro = service.getInfAdic(cod_usu);
                } catch (Exception e) {
                }
                ModelAndView mav = new ModelAndView("main.usuario.detalle.adic");
                mav.addObject("cod_usu", sesion.getAttribute("cod_usu"));
                mav.addObject("cod_rol", sesion.getAttribute("cod_rol"));
                mav.addObject("usuario_nombre", sesion.getAttribute("nombre"));
                mav.addObject("registro", registro);
                return mav;
            }
        } else {
            ModelAndView mav = new ModelAndView("index");
            return mav;
        }
    }

    @RequestMapping(params = "action=guardar_inf_adic")
    public ModelAndView guardarInfAdic(@ModelAttribute Usuario registro, HttpServletRequest request) {
        HttpSession sesion = request.getSession();
        UsuarioService service = new UsuarioService();
        if (sesion.getAttribute("cod_usu") != null) {
            ModelAndView mav = new ModelAndView("mensaje");
            mav.addObject("cod_usu", sesion.getAttribute("cod_usu"));
            mav.addObject("cod_rol", sesion.getAttribute("cod_rol"));
            mav.addObject("usuario_nombre", sesion.getAttribute("nombre"));
            try {
                if (service.insertInfAdic(registro)) {
                    mav.addObject("msg", "Se registró los datos correctamente");
                    return mav;
                }
            } catch (Exception e) {
            }
            return mav;
        } else {
            ModelAndView mav = new ModelAndView("index");
            return mav;
        }
    }

    @RequestMapping(params = "action=get_inf_adic")
    public ModelAndView getInfAdic(HttpServletRequest request) {
        HttpSession sesion = request.getSession();
        UsuarioService service = new UsuarioService();
        Usuario registro = null;
        if (sesion.getAttribute("cod_usu") != null) {
            String cod_usu = (String) sesion.getAttribute("cod_usu");
            ModelAndView mav = new ModelAndView("main.usuario.mod.detalle.adic");
            try {
                registro = service.getInfAdic(cod_usu);
                mav.addObject("cod_usu", sesion.getAttribute("cod_usu"));
                mav.addObject("cod_rol", sesion.getAttribute("cod_rol"));
                mav.addObject("usuario_nombre", sesion.getAttribute("nombre"));
                mav.addObject("registro", registro);
            } catch (Exception e) {
            }
            return mav;
        } else {
            ModelAndView mav = new ModelAndView("index");
            return mav;
        }
    }

    @RequestMapping(params = "action=modificar_inf_adic")
    public ModelAndView modificarInfAdic(@ModelAttribute Usuario registro, HttpServletRequest request) {
        HttpSession sesion = request.getSession();
        UsuarioService service = new UsuarioService();
        if (sesion.getAttribute("cod_usu") != null) {
            ModelAndView mav = new ModelAndView("mensaje");
            mav.addObject("cod_usu", sesion.getAttribute("cod_usu"));
            mav.addObject("cod_rol", sesion.getAttribute("cod_rol"));
            mav.addObject("usuario_nombre", sesion.getAttribute("nombre"));
            try {
                String cod_usu = (String) sesion.getAttribute("cod_usu");
                Usuario usuario = service.getInfAdic(cod_usu);
                registro.setIdAca(usuario.getIdAca());
                registro.setIdPro(usuario.getIdPro());
                if (service.updateInfAdic(registro)) {
                    mav.addObject("msg", "Se modificó los datos correctamente");
                    return mav;
                }
            } catch (Exception e) {
            }
            return mav;
        } else {
            ModelAndView mav = new ModelAndView("index");
            return mav;
        }
    }

    @RequestMapping(params = "action=alumnos_lista")
    public ModelAndView mostrarFormBusq(HttpServletRequest request) {
        HttpSession sesion = request.getSession();
        if (sesion.getAttribute("cod_usu") != null) {
            ModelAndView mav = new ModelAndView("main.alumnos.lista");
            UsuarioService service = new UsuarioService();
            ArrayList<Usuario> lista = null;
            try {
                lista = service.getListaAlumnos();

            } catch (Exception ex) {
            }
            mav.addObject("usuario_nombre", sesion.getAttribute("nombre"));
            mav.addObject("lista", lista);
            return mav;
        } else {
            ModelAndView mav = new ModelAndView("mensaje");
            String msg = "Debe iniciar sesión para visualizar esta información";
            mav.addObject("msg", msg);
            return mav;
        }
    }

    @RequestMapping(params = "action=get_inf_usu")
    public ModelAndView getInfoUsu(HttpServletRequest request) {
        HttpSession sesion = request.getSession();
        Usuario registro = null;
        UsuarioService service = new UsuarioService();
        if (sesion.getAttribute("cod_usu") != null) {
            ModelAndView mav = new ModelAndView("main.usuario.mod");
            String cod_usu = (String) sesion.getAttribute("cod_usu");
            registro = new Usuario();
            try {
                registro = service.getById(cod_usu);
            } catch (Exception ex) {
                Logger.getLogger(UsuarioController.class.getName()).log(Level.SEVERE, null, ex);
            }
            mav.addObject("cod_usu", sesion.getAttribute("cod_usu"));
            mav.addObject("cod_rol", sesion.getAttribute("cod_rol"));
            mav.addObject("usuario_nombre", sesion.getAttribute("nombre"));
            mav.addObject("registro", registro);
            return mav;
        } else {
            ModelAndView mav = new ModelAndView("index");
            return mav;
        }
    }

    @RequestMapping(params = "action=mod_inf_usu")
    public ModelAndView modificarUsuario(@ModelAttribute Usuario registro, HttpServletRequest request) {
        HttpSession sesion = request.getSession();
        UsuarioService service = new UsuarioService();
        if (sesion.getAttribute("cod_usu") != null) {
            ModelAndView mav = new ModelAndView("mensaje");
            mav.addObject("cod_usu", sesion.getAttribute("cod_usu"));
            mav.addObject("cod_rol", sesion.getAttribute("cod_rol"));
            mav.addObject("usuario_nombre", sesion.getAttribute("nombre"));
            try {
                if (service.update(registro)) {
                    String cod_usu = (String) sesion.getAttribute("cod_usu");
                    registro = service.getById(cod_usu);
                    sesion.removeAttribute("nombre");
                    sesion.setAttribute("nombre", registro.getNombre());
                    mav.addObject("usuario_nombre", sesion.getAttribute("nombre"));
                    mav.addObject("msg", "Se modificó los datos correctamente");
                    return mav;
                }
            } catch (Exception e) {
            }
            return mav;
        } else {
            ModelAndView mav = new ModelAndView("index");
            return mav;
        }
    }

    @RequestMapping(params = "action=cambiar_clave")
    public ModelAndView mostrarCambioClave(HttpServletRequest request) {
        HttpSession sesion = request.getSession();
        if (sesion.getAttribute("cod_usu") != null) {
            Usuario registro = new Usuario();
            ModelAndView mav = new ModelAndView("main.usuario.cambio.clave");
            mav.addObject("cod_usu", sesion.getAttribute("cod_usu"));
            mav.addObject("cod_rol", sesion.getAttribute("cod_rol"));
            mav.addObject("usuario_nombre", sesion.getAttribute("nombre"));
            mav.addObject("registro", registro);
            return mav;
        } else {
            ModelAndView mav = new ModelAndView("index");
            return mav;
        }
    }

    @RequestMapping(params = "action=guardar_cambio_clave")
    public ModelAndView cambiarContraseña(@ModelAttribute Usuario registro, HttpServletRequest request) {
        HttpSession sesion = request.getSession();
        UsuarioService service = new UsuarioService();
        if (sesion.getAttribute("cod_usu") != null) {
            String cod_usu = (String) sesion.getAttribute("cod_usu");
            try {
                if (!isVacio(service.getByPassActCodUsu(registro.getClave(), cod_usu))) {
                    String nuevaClave = request.getParameter("nuevaClave");
                    registro.setClave(nuevaClave);
                    registro.setCod_usu(cod_usu);
                    if (service.changePass(registro)) {
                        ModelAndView mav = new ModelAndView("mensaje");
                        mav.addObject("cod_usu", sesion.getAttribute("cod_usu"));
                        mav.addObject("cod_rol", sesion.getAttribute("cod_rol"));
                        mav.addObject("usuario_nombre", sesion.getAttribute("nombre"));
                        String msg = "La contraseña se cambió exitosamente";
                        mav.addObject("msg", msg);
                        return mav;
                    }
                }
            } catch (Exception e) {
            }
            return null;
        } else {
            ModelAndView mav = new ModelAndView("index");
            return mav;
        }
    }
}
